﻿(function(ui) {
	ui._Renderer = {
		/** 设置渲染器的参数
		 *  @param {Object} op 列columns的属性参数
		 */
		setOption : function(op) {
			if (this.css)
				op.cssName = this.css + " " + (op.cssName || "");
			this.initFormat(op.format);
			op.content = this.getFormat(op.displayField || op.field, op.format);
		},
		/** 初始化format
		 *  @param {Object} format 列columns的format属性值
		 */
		initFormat : function(format) {

		},
		/** 初始化时，返回设置页面显示格式
		 *  @param {String} field 列columns的field属性值
		 *  @param {Object} format 列columns的format属性值
		 *  @return {}
		 */
		getFormat : function(field, format) {
			return '${' + field + '}';
		},
		/** 编辑之前，返回获取该列的值
		 *  @param {Object} target 该单元格对象
		 *  @param {Object} format 列columns的format属性值
		 *  @return {}
		 */
		getValue : function(target, format) {
			return this.parse(this.getText(target), format);
		},
		/** 编辑之前，返回获取该列的文本
		 *  @param {Object} target 该单元格对象
		 *  @return {}
		 */
		getText : function(target) {
			return target[0].tagName == 'INPUT' ? target.val() : target.text();
		},
		/** 编辑之后，返回该列的值
		 *  @param {String} value 编辑之后的值
		 *  @return {}
		 */
		parse : function(value) {
			return value || "";
		},
		/** 编辑之后，返回设置页面显示的格式
		 *  @param {Object} value 编辑之后的值
		 *  @param {Object} format 列columns的format属性值
		 *  @return {}
		 */
		format : function(value, format) {
			return (value != null) ? value : "";
		},
		/** 编辑之后，设置页面显示的格式
		 *  @param {Object} target 该单元格对象
		 *  @param {Object} value 编辑之后的值
		 *  @param {Object} format 列columns的format属性值
		 */
		render : function(target, value, format) {
			var value = this.format(value, format);
			target[0].tagName == 'INPUT' ? target.val(value) : target.html(Ccay.Format.formatSpace(value));
		}
	}

	ui.Renderer = $.IAdapter(ui._Renderer, null, true);

	/***************************  renderer注册  ***********************************/
	(function(Renderer) {
		/** integer：整数类型
		 */
		Renderer.add('integer', {
					css : "num",
					getFormat : function(field, format) {
						return "${Ccay.Format.toInt({0})}".formatText(field);
					},
					parse : function(value) {
						return Ccay.Format.toNumber(value);
					}
				});

		/** number：数字类型
		 *  format.fraction {Number} 设置该列显示的数字类型的小数位数，默认为2位小数
		 */
		Renderer.add('number', {
					css : "num",
					getFormat : function(field, format) {
						return "${#Ccay.Format.toDecimal({0},{1})}".formatText(field, format.fraction || 'null');
					},
					format : function(value, format) {
						if (!format)
							format = {};
						return Ccay.Format.toDecimal(value, format.fraction);
					},
					parse : function(value) {
						return Ccay.Format.toNumber(value);
					}
				});
		
		/** ccayInputHistory：历史输入联想
		 */
		Renderer.add('listoryInput', {
			setOption : function(op) {
				op.valueField || (op.valueField = op.field);
				this.callParent("setOption", [op]);
			},
			initFormat : function(format) {
				if (format) {
					if (!format.data) {
						//将动态数据转换成静态数据
						format.data = ui.getStaticData(format);
					}
				}
			},
			getValue : function(target, format) {
				var value = target.attr('val'), text = target.text();
				return {
					value : value || "",
					text : text || ""
				};
			},
			render : function(target, valueObj, format) {
				target.attr('val', valueObj.value).text(valueObj.text);
			}
		});

		/** currency：钱币类型
		 *  format.fraction {Number} 设置该列显示的数字类型的小数位数，默认为2位小数
		 *  format.flag {String} 设置该列显示的钱币类型的符号，格式为：'$[currency]'
		 */
		Renderer.add('currency', {
					css : "cur",
					getFormat : function(field, format) {
						return "${#Ccay.Format.toCurrency({0},{1},'{2}')}".formatText(field, format.fraction || Ccay.Config.Format.decimalfraction, format.flag || '');
					},
					format : function(value, format) {
						if (!format)
							format = {};
						return Ccay.Format.toCurrency(value, format.fraction || Ccay.Config.Format.decimalfraction, format.flag);
					},
					parse : function(value) {
						return Ccay.Format.toNumber(value);
					}
				});
		
		/** currencystr：大钱币类型(大于15位)
		 *  format.fraction {Number} 设置该列显示的数字类型的小数位数，默认为2位小数
		 *  format.flag {String} 设置该列显示的钱币类型的符号，格式为：'$[currencystr]'
		 */
		Renderer.add('currencystr', {
					css : "cur",
					getFormat : function(field, format) {
						return "${#Ccay.Format.toCurrencyStr({0},{1},'{2}')}".formatText(field, format.fraction || Ccay.Config.Format.decimalfraction, format.flag || '');
					},
					format : function(value, format) {
						if (!format)
							format = {};
						return Ccay.Format.toCurrencyStr(value, format.fraction || Ccay.Config.Format.decimalfraction, format.flag);
					},
					parse : function(value) {
						return value;
					}
				});
		
		/** date：日期类型
		 *  format.dateFormat {String} 设置该列显示的日期类型的格式
		 *  format.renderFormat {String} 设置该列显示的日期类型的格式，同dateFormat属性功能一样，但优先级高于dateFormat属性
		 */
		Renderer.add('date', {
					css : "date",
					getFormat : function(field, format) {
						return "${#Ccay.Format.toDateStr({0},'{1}','{2}')}".formatText(field, format.dateFormat || '', format.renderFormat || '');
					},
					format : function(value, format) {
						if (!format)
							format = {};
						return Ccay.Format.toDateStr(value, format.dateFormat, format.renderFormat);
					},
					parse : function(value) {
						return Ccay.Format.toDate(value);
					}
				});

		/** datetime：日期时间类型。对该列进行格式化设置同date类型一致
		 */
		Renderer.add('datetime', {
					css : "date",
					getFormat : function(field, format) {
						return "${#Ccay.Format.toDateTimeStr({0},'{1}','{2}')}".formatText(field, format.dateFormat || '', format.renderFormat || '');
					},
					format : function(value, format) {
						if (!format)
							format = {};
						return Ccay.Format.toDateTimeStr(value, format.dateFormat, format.renderFormat);
					},
					parse : function(value) {
						return Ccay.Format.toDate(value);
					}
				});
		/** dateym：年月类型
		 */
		Renderer.add('dateym', {
					css : "date",
					getFormat : function(field, format) {
						return "${#Ccay.Format.toDateYMStr({0},'{1}','{2}')}".formatText(field, format.renderFormat || format.dateFormat || Ccay.Config.Format['dateym'] || '', format.renderFormat || '');
					},
					format : function(value, format) {
						if (!format)
							format = {};
						return Ccay.Format.toDateYMStr(value, format.renderFormat || format.dateFormat, format.renderFormat);
					},
					parse : function(value) {
						return Ccay.Format.toDate(value);
					}
				});
		
		/**
		 * datehm：年月日时分类型
		 */
		Renderer.add('datehm', {
	        css : "date",
	        getFormat : function(field, format) {
	            return "${#Ccay.Format.toDateTimeStr({0},'{1}','{2}')}".formatText(field, format.dateFormat || Ccay.Config.Format.datehm, format.renderFormat  || Ccay.Config.Format.datehm);
	        },
	        format : function(value, format) {
	            if (!format)
	               format = {};
	            return Ccay.Format.toDateTimeStr(value, format.dateFormat || Ccay.Config.Format.datehm, format.renderFormat || Ccay.Config.Format.datehm);
	        },
	        parse : function(value) {
	            return Ccay.Format.toDate(value);
	        }
		});

		
		/** bool：布尔类型
		 *  format.htmlView {Boolean} 设置该列是否显示的试图
		 */
		Renderer.add('bool', {
					css : "bool",
					setOption : function(op) {
						op.valueField = op.field;
						this.callParent("setOption", [op]);
					},
					getFormat : function(field, format) {
						var htmlView = (format.htmlView != null) ? format.htmlView : true, 
							noFork = (format.noFork != null) ? format.noFork : false;
						return "${#Ccay.Format.toBoolView({0},{1},{2})}".formatText(field, htmlView, noFork);
					},
					getValue : function(target, format) {
						return this.parse(target.attr('val'), format);
					},
					parse : function(value, format) {
						if(format && format.nullValue)
						{
							if(value == null || value == '')
								return null;
						}
						var type = typeof(value);
						if (type != 'boolean') {
							if(value == "true" || value == '1')
								value = true;
							else
								value = false;
						}
						// 判断格式化值
						if (format && format.isBool) {
							return value ? true : false;
						} else {
							return value ? 1 : 0;
						}
					},
					format : function(value, format) {
						!format && (format = {});
						var htmlView = (format.htmlView != null) ? format.htmlView : true, 
							noFork = (format.noFork != null) ? format.noFork : false;
						return Ccay.Format.toBoolView(value, htmlView, noFork);
					},
					render : function(target, value, format) {
						value = this.parse(value, format);
						target.attr('val', value);
						target.html(this.format(value, format));
					}
				});

		/** ellipsis：缩略类型
		 *  format.len {Number} 设置该列显示的缩略类型所显示的字符个数
		 */
		Renderer.add('ellipsis', {
					getFormat : function(field, format) {
						return "${#Ccay.Format.toEllipsis({0}, {1})}".formatText(field, format.len || 'null');
					},
					getValue : function(target) {
						return target.children().attr('title');
					},
					format : function(value, format) {
						if (!format)
							format = {};
						return Ccay.Format.toEllipsis(value, format.len || 'null');
					},
					render : function(target, value, format) {
						target.html(this.format(value, format));
					}
				});

		/** longtext：长文本类型
		 *  format.height {String} 设置该列显示的长文本类型的高度
		 */
		Renderer.add('longtext', {
					getFormat : function(field, format) {
						return "<div class='ccay-renderer-textarea' style='height:{1};'>{0}</div>".formatValue('${' + field + '}', format.height || "100%");
					},
					format : function(value, format) {
						if (!format)
							format = {};
						return "<div class='ccay-renderer-textarea' style='height:{1};'>{0}</div>".formatValue(Ccay.Format.formatSpace(value), format.height || "100%");
					},
					render : function(target, value, format) {
						target.html(this.format(value, format));
					}
				});

		/** ldap：人员类型
		 */
		Renderer.add('ldap', {
					css : "ldap",
					setOption : function(op) {
						op.valueField || (op.valueField = op.field);
						this.callParent("setOption", [op]);
					},
					initFormat : function(format) {
						if (format) {
							format.valueField = format.valueField || "userId";
						}
					},
					getValue : function(target, format) {
						return {
							value : target.attr('val') || "",
							text : target.text().replace(/\s/g," ") || ""
						};
					},
//					parse : function(valueObj) {
//						return valueObj ? valueObj.value || valueObj : valueObj;
//					},
					render : function(target, valueObj, format) {
						target.attr('val', valueObj.value).text(valueObj.text);
					}
				});


		/** enum：枚举类型
		 *  format.valueField {String} 设置该列枚举类型的值
		 *  format.displayField {String} 设置该列显示的枚举类型的文本
		 *  format.cacheKey {String} 设置该列显示的枚举类型的数据源缓存key值
		 *  format.service {String} 设置该列显示的枚举类型的动态数据源
		 *  format.data {String} 设置该列显示的枚举类型的静态数据源
		 */
		Renderer.add('enum,suggest,popbox', {
					css : "enum",
					setOption : function(op) {
						op.valueField || (op.valueField = op.field);
						this.callParent("setOption", [op]);
					},
					initFormat : function(format) {
						if (format) {
							format.valueField = Ccay.Format.getField(format.valueField, 'value');
							format.displayField = Ccay.Format.getField(format.displayField, 'display');
							format.cacheKey || (format.cacheKey = typeof(format.service) == "string" ? format.service : $.newGuid("render_"));
							//可枚举类型处理
							var service = format.service;
							if (typeof(service) == "string" && service.indexOf(":") > 0) {
								var dsconfig = service.split(":"), dsType = dsconfig[0], ds = dsconfig[1].replace(/(^\s*)/, "");
								if(dsType === "ENUM"){
									format.valueField = "value";
									format.displayField = "displayValue";
									format.cacheKey = $.newGuid("render_");
								}
							}
							//将动态数据转换成静态数据
							if (!format.data) {
								format.data = ui.getStaticData(format);
							}
						}
					},
					getFormat : function(field, format) {
						if (format.data) {
							var data;
							if ($.isArray(format.data)) {
								//将数据由数组格式转换成对象格式
								data = Ccay.Format.convertArrayToObject(format.data, format.valueField, format.displayField);
							}
							//将数据放入缓存中
							Ccay.Cache.put(format.cacheKey, data || format.data);
							//在缓存数据中根据值获取显示文本
							return "${#Ccay.Format.getObjectText({0},'{1}')}".formatText(field, format.cacheKey);
						}
						return this.callParent("getFormat", [field, format]);
					},
					getValue : function(target) {
						return {
							value : target.attr('val') || "",
							text : target.text() || ""
						};
					},
					render : function(target, valueObj, format) {
						//debugger;
						!format && (format = {});
						valueObj = Ccay.Format.toValueObj(valueObj, format.data, format.valueField, format.displayField);
						target.attr('val', valueObj.value).text(valueObj.text);
					}
				});

		Renderer.add('enumExtend,popup,popupProgramInfo', {
					css : "enumExtend",
					setOption : function(op) {
						op.valueField || (op.valueField = op.field);
						this.callParent("setOption", [op]);
					},
					getValue : function(target) {
						return {
							value : target.attr('val') || "",
							text : target.text() || ""
						};
					},
					render : function(target, valueObj, format) {
						valueObj = Ccay.Format.toValueObj(valueObj, format ? format.data : null)
						target.attr('val', valueObj.value).text(valueObj.text);
					}
				});

		/** childRender：子渲染类型
		 */
		Renderer.add('childRender', {
					render : function(target, value) {
						target.find('.child-render').text(value);
					}
				});

		/** rate：比率类型
		 *  format.total {Number} 设置该列显示的比率类型的总数
		 *  format.fraction {Number} 设置该列显示的比率类型的小数位数，默认为2位小数
		 *  format.htmlView {Boolean} 设置该列是否显示的试图
		 *  format.section {Array} 设置该列显示的比率类型的区域
		 */
		Renderer.add('rate', {
					css : "rate",
					setOption : function(op) {
						op.valueField = op.field;
						this.callParent("setOption", [op]);
					},
					getFormat : function(field, format) {
						return "${#Ccay.Format.toRate({0},{1},{2},{3},'{4}')}".formatText(field, format.total || 'null', format.fraction || 'null', format.htmlView || 'null', format.section);
					},
					getValue : function(target) {
						return target.attr('val') * 1;
					},
					format : function(value, format) {
						if (!format)
							format = {};
						return Ccay.Format.toRate(value, format.total, format.fraction, format.htmlView, format.section);
					},
					render : function(target, value, format) {
						target.attr('val', value);
						target.html(this.format(value, format));
					}
				});

		Renderer.add('filesize', {
					css : "num",
					getFormat : function(field, format) {
						return "${#Ccay.Format.toFileSize({0},null,'{1}')}".formatText(field, format.unit || "K");
					},
					getValue : function(target) {
						return target.attr("val") || target.text();
					},
					format : function(value, format) {
						if (!format)
							format = {};
						return Ccay.Format.toFileSize(value, null, format.unit || "K");
					},
					render : function(target, value, format) {
						target.attr("val", value);
						target.text(this.format(value, format));
					}
				});
		/**
		 * country国家
		 */
		Renderer.add('country', {
					getValue : function(target) {
						return target.text() || "";
					},
					parse : function(valueObj) {
						return valueObj;
					},
					render : function(target, valueObj, format) {
						target.attr('val', valueObj).text(valueObj);
					}
				});
		/**
		 * company公司
		 */
		Renderer.add('company', {
					setOption : function(op) {
						op.valueField || (op.valueField = op.field);
						this.callParent("setOption", [op]);
					},
					getValue : function(target) {
						return {
							value:target.attr("val") || "",
							text:target.text() || ""
						}
					},
					render : function(target, valueObj, format) {
						valueObj = Ccay.Format.toValueObj(valueObj);
						target.attr('val', valueObj.value).text(valueObj.text);
					}
				});
		/**
		 * area片区代办
		 */
		Renderer.add('area', {
					setOption : function(op) {
						op.valueField || (op.valueField = op.field);
						this.callParent("setOption", [op]);
					},
					getValue : function(target) {
						return {
							value:target.attr("val") || "",
							text:target.text() || ""
						}
					},
					render : function(target, valueObj, format) {
						valueObj = Ccay.Format.toValueObj(valueObj);
						target.attr('val', valueObj.value).text(valueObj.text);
					}
				});
		/**
		 * iCurrency货币
		 */
		Renderer.add('iCurrency', {
					getValue : function(target) {
						return target.text() || "";
					},
					parse : function(valueObj) {
						return valueObj;
					},
					render : function(target, valueObj, format) {
						target.attr('val', valueObj).text(valueObj);
					}
				});
		/**
		 * location行政区划分
		 */
		Renderer.add('location', {
					getValue : function(target) {
						return target.text() || "";
					},
					parse : function(valueObj) {
						return valueObj;
					},
					render : function(target, valueObj, format) {
						target.attr('val', valueObj).text(valueObj);
					}
				});
		/**
		 * pbi
		 */
		Renderer.add('pbi', {
					getValue : function(target) {
						return target.text() || "";
					},
					parse : function(valueObj) {
						return valueObj;
					},
					render : function(target, valueObj, format) {
						target.attr('val', valueObj).text(valueObj);
					}
				});
		/** @description 人员信息弹出框 */
		Renderer.add('personInfo', {
			getFormat : function(field, format) {
				return "${#Ccay.Format.showPersonInfo('{0}', '{1}', data)}".formatValue(format.valueField || field, format.displayField || field);
			}		
		});
		/** @description 群组信息弹出框 */
		Renderer.add('groupInfo', {
			getFormat : function(field, format) {
				return "${#Ccay.Format.showGroupInfo('{0}', '{1}', data)}".formatValue(format.valueField || field, format.displayField || field);
			}		
		});
		
		/** money：货币组件
		 */
		Renderer.add('money', {
			setOption : function(op) {
				op.format.amountField = op.editorOp.amountName;
				op.format.codeField = op.editorOp.currencyCodeName;
				op.format.decimalLen = op.editorOp.decimalLen;
				this.callParent("setOption", [op]);
			},
			getFormat : function(field, format) {
				return "${#Ccay.Format.formatAmount('{0}','{1}','{2}','{3}',data)}".formatValue(field,format.amountField,format.codeField,format.decimalLen || 2);
			},
			parse : function(valueObj) {
				return valueObj;
			},
			render : function(target, value, format) {
				if(value.text)
				target.attr('val', value.text).text(value.text);
			}
		});

	})(ui.Renderer);
})(Ccay.UI);